#include "protocole_client.h"
#include "protocole_com.h"
#include "../fiche.h"
#include <string.h>
#include "../contact.h"
#include <stdio.h>
#include <stdlib.h>
#include "itoa.h"
/*
 * envoie un nouveau contact à l'annuaire
 * message à envoyer    :   [ 000 Contact ]
 * message à recevoir   :   [ 100 1 "Contact Bien ajouté" ]
 * message d'erreur     :   [ 100 0 "CODE_ERREUR" "description" ]
 * */
int client_ajout(const pContact contact)
{
    int err;
    char message[33];
    pFiche f= creerFiche(contact);
    fprintf(stderr, "AJOUT : envoie de 000\\n.\n");

    if( com_envoie_message("000\n"))
    {
	fprintf(stderr, "Serveur deconecté\n");
	return 1;
    }

    fprintf(stderr, "AJOUT : 000\\n envoyé.\n" );

    fprintf(stderr, "AJOUT : envoie de ka structure contact\nle nom est : %s\n", contact->nom);
    if (0 !=(err=com_envoie_structure(f)))
    {
	if (err == 1)
	    return 1;
	fprintf(stderr,"AJOUT : ERREUR %d : com_envoie_structure() !!!\n", err);
	return -2;
    }
    fprintf(stderr, "AJOUT : structure contact envoyé.\n");


    fprintf(stderr, "AJOUT : j'attend la reponse du serveur\n");
    if(com_recoit_message(message))
	return 1;
    fprintf(stderr, "AJOUT : j'ai recu: %s\n", message);
    if ( message[3] == '0' )
    {
	fprintf(stderr, "AJOUT : ERREUR: probleme dans la structure fiche !!!\n");
	return 2;
    }


    fprintf(stderr, "AJOUT : SUCCES\n");

    return 0; 
}

/*
 * modifie un contact présent dans l'annuaire
 * message à envoyer    :   [ 001 Contact Idenfifiant ]
 * message à recevoir   :   [ 100 1 "Contact bien modifié" ]
 * message d'erreur     :   [ 100 0 "CODE_ERREUR" "description" ]
 */
int client_modification(const pContact contact, const pIdentifiant id)
{
    char message[33];

    pFiche fi= creerFiche(contact);
    fi->i= *id;


    fprintf(stderr, "MODIFICATION : envoie de 001\\n.\n");
    if( com_envoie_message("001\n"))
    {
	fprintf(stderr, "MODIFICATION : ERREUR : com_envoie_message()\n");
	return 1;
    }
    fprintf(stderr, "MODIFICATION : 001\\n envoyé\n");

    fprintf(stderr, "MODIFICATION : envoie de la structure fiche\n");
    if( com_envoie_structure(fi))
    {
	fprintf(stderr, "MODIFICATION : ERREUR : com_envoie_structure()\n");
	return 1;
    }
    fprintf(stderr, "MODIFICATION : structure fiche envoyé\n");

    fprintf(stderr, "MODIFICATION : attente de la reponse du serveur\n");
    if(    com_recoit_message(message))
	return 1;
    fprintf(stderr, "MODIFICATION : message %s recu\n", message);

    if (message[3] == '0')
    {
	fprintf(stderr, "MODIFICATION : ERREUR : modification echoué\n");
	return -3;
    }

    fprintf(stderr, "MODIFICATION : SUCCES\n");

    return 0; 
}


/*
 * consulte les contact présent dans l'annuaire à l'aide du nom
 * message à envoyer    :   [ 011 NOM ]
 * message à recevoir   :   [ 101 Contact Idenfifiant ]
 *                          ... 
 *                          [ 101 Contact Idenfifiant ]
 *                          [ 100 1 "Liste des contact envoyé" ]
 * message d'erreur     :   [ 100 0 "CODE_ERREUR" "description" ]
 */
int client_consultation(const char * nom , listeCirculaire * l)
{
    int init=0;
    char tmp[34];
    char message[33];
    *l = NULL;

    fprintf(stderr, "CONSULTATION : envoie du message 001\\n.\n");
    if(  com_envoie_message("011\n"))
	return 1;
    fprintf(stderr, "CONSULTATION : 001\\n envoyé\n");
    strcpy(tmp, nom);
    pFiche fi;
    strcat(tmp, "\n\0");
    fprintf(stderr, "CONSULTATION :  envoie du nom : %s\n", tmp);
    if(   com_envoie_message(tmp))
	return 1;
    fprintf(stderr, "CONSULTATION : nom envoyé\n");
    do{

	fprintf(stderr, "CONSULTATION : attende d'une reponse\n");
	if(com_recoit_message(message))
	    return 1;
	fprintf(stderr, "CONSULTATION : j'ai recu une reponse : %s", message);
	if( !strncmp(message, "101", 3) )/* Il ne rentre jamais ici */
	{
	    fprintf(stderr, "CONSULTATION : j'attend une structure\n");
	    if( com_recoit_structure(&fi) )
		return 1;
	    fprintf(stderr, "CONSULTATION : j'ai recu une structure\n");
	    if(init==0)
	    {
		fprintf(stderr, "CONSULTATION : je crée la liste circulaire\n");
		(*l) = creerListeCirculaire(*fi); 
		afficherListeCirculaire(*l);
		fprintf(stderr, "CONSULTATION : je recupere la premiere fiche\n");
		init = 1;
	    }
	    else
	    {
		fprintf(stderr, "CONSULTATION : j'ajoute une fiche a la liste circulaire\n");
		ajouterFicheListeCirculaire(*l, *fi);
		afficherListeCirculaire(*l);
	    }

	}
	else if (message[3] == '1')
	{
	    fprintf(stderr, "CONSULTATION : SUCCES\n");
	    return 0;
	}
	else if (message[3] == '0')
	{
	    fprintf(stderr, "CONSULTATION : ERREUR : impossible de consulter\n");
	    return -3;
	}
    }
    while(1);
}

/*
 * supprime un contact de l'annuaire a l'aide de l'identifiant
 * message à envoyer    :   [ 010 Idenfifiant ]
 * message _ recevoir   :   [ 100 1 "Contact supprimé"
 * message d'erreur     :   [ 100 0 "CODE_ERREUR" "description" ]
 */


int client_suppression(int id)
{
    char message[34];
    int taille;
    message[0]='\n';
    fprintf(stderr, "SUPPRESSION: j'envoie 010\n");
    if( com_envoie_message("010\n"))
	return 1;
    fprintf(stderr, "SUPPRESSION:j'ai envoyé 010\n");
    taille = itoa_perso(id, message);
    message[taille] = '\n';
    message[taille+1] = '\0';
    fprintf(stderr, "SUPPRESSION:j'envoie %s\n", message);
    if( com_envoie_message(message))
	return 1;
    fprintf(stderr, "SUPPRESSION: j'ai envoyé une structure fiche\n");
    fprintf(stderr, "SUPPRESSION:j'attend une reponse\n");
    if(0 !=com_recoit_message(message))
    {
	fprintf(stderr, "SUPPRESSION: ERREUR supression impossible\n");
    }
    fprintf(stderr, "SUPPRESSION: SUCCES\n");
    return 0; 
}




